#define _CRT_SECURE_NO_WARNINGS 1

class Solution {
public:
	//一个字符串数组来让电话号码作为下标精准对应字符串   两个空字符串让2对准了"abc"
	string Num_To_Str[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };

	void Combine(string& digits, int di, string cbstr, vector<string>& v)
	{
		if (di == digits.size())//表明digits这个数组已经被遍历完成，目前是超过的一次，
		{                      //也就是说:该次递归已达最深，得到一个完全的字符串，将其push_back进v中
			v.push_back(cbstr);
			return;
		}

		int i = digits[di] - '0';//获取digits这个字符串里面的字符 -'0'转换为int值，得到单个电话号码
		string  str = Num_To_Str[i];//将电话号码作为Num_To_Str下标得到对应的字符串

		for (int j = 0; j < str.size(); j++)//电话号码对应的字符串会在整个递归的过程中逐渐被全部遍历
		{

			Combine(digits, di + 1, cbstr + str[j], v);
		}   //              下标+1   cbstr字符串获取到了每次该获取到的一个字符

	}
	vector<string> letterCombinations(string digits) {
		vector<string> v;//v是最后的返回值 该字符数组存储了类似["ad","ae","af","bd","be","bf","cd","ce","cf"]的值
		if (digits.empty())//如果电话号码都没有
			return v; 则返回v

			Combine(digits, 0, "", v);//第一次调用递归函数

		return v;
	}
};